// Copyright 2019 Google LLC.

#include "modules/skparagraph/include/FontArguments.h"

static bool operator == (const SkFontArguments::VariationPosition::Coordinate &a,
    const SkFontArguments::VariationPosition::Coordinate &b)
{
    return a.axis == b.axis && a.value == b.value;
}

static bool operator == (const SkFontArguments::Palette::Override &a, const SkFontArguments::Palette::Override &b)
{
    return a.index == b.index && a.color == b.color;
}

namespace std {
size_t hash<skia::textlayout::FontArguments>::operator () (const skia::textlayout::FontArguments &args) const
{
    size_t hash = 0;
    hash ^= std::hash<int>()(args.fCollectionIndex);
    for (const auto &coord : args.fCoordinates) {
        hash ^= std::hash<SkFourByteTag>()(coord.axis);
        hash ^= std::hash<float>()(coord.value);
    }
    hash ^= std::hash<int>()(args.fPaletteIndex);
    for (const auto &override : args.fPaletteOverrides) {
        hash ^= std::hash<int>()(override.index);
        hash ^= std::hash<SkColor>()(override.color);
    }
    return hash;
}
} // namespace std

namespace skia {
namespace textlayout {
FontArguments::FontArguments(const SkFontArguments &args)
    : fCollectionIndex(args.getCollectionIndex()),
      fCoordinates(args.getVariationDesignPosition().coordinates,
    args.getVariationDesignPosition().coordinates + args.getVariationDesignPosition().coordinateCount),
      fPaletteIndex(args.getPalette().index),
      fPaletteOverrides(args.getPalette().overrides, args.getPalette().overrides + args.getPalette().overrideCount)
{}

bool operator == (const FontArguments &a, const FontArguments &b)
{
    return a.fCollectionIndex == b.fCollectionIndex && a.fCoordinates == b.fCoordinates &&
        a.fPaletteIndex == b.fPaletteIndex && a.fPaletteOverrides == b.fPaletteOverrides;
}

bool operator != (const skia::textlayout::FontArguments &a, const skia::textlayout::FontArguments &b)
{
    return !(a == b);
}

sk_sp<SkTypeface> FontArguments::CloneTypeface(const sk_sp<SkTypeface> &typeface) const
{
    SkFontArguments::VariationPosition position{ fCoordinates.data(), static_cast<int>(fCoordinates.size()) };

    SkFontArguments::Palette palette{ fPaletteIndex, fPaletteOverrides.data(),
        static_cast<int>(fPaletteOverrides.size()) };

    SkFontArguments args;
    args.setCollectionIndex(fCollectionIndex);
    args.setVariationDesignPosition(position);
    args.setPalette(palette);

    return typeface->makeClone(args);
}
} // namespace textlayout
} // namespace skia
